/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.aplicacao;

import com.interact.sas.cmn.ApplicationContext;
import com.interact.sas.cmn.db.services.Database;
import com.interact.sas.cmn.db.services.QueryResult;
import com.interact.sas.cmn.util.Login;
import com.interact.sas.cmn.util.Prompts;
import com.interact.sas.qms.data.Occurrence;
import com.interact.sas.qms.data.OccurrenceType;
import com.interact.sas.qms.util.OccurrenceFormFactory;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.sql.*;
import com.sistema.db.Banco;
import com.sistema.db.LerProperties;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;

/**
 *
 * @author geraldo
 */
public class PanelAdicionarLigacoes extends JPanel
{

    private JComboBox cbxClientes;
    private JButton btnRealizadas;
    private JButton btnRecebidas;
    private JTextField txt_qtde_ligacao;
    public static JCheckBox checkTicket;
    public static JLabel lbl_msg;
    public static ImageIcon img_sucesso;
    public static ImageIcon img_erro;
    private Occurrence ocorrencia = new Occurrence();
    private LerProperties properties = new LerProperties();

    public PanelAdicionarLigacoes()
    {

        setLayout( null );
        setVisible( true );
        iniciaComponentes();
        actions();

    }

    public void iniciaComponentes()
    {

        JLabel titulo;
        add( titulo = new JLabel( "Registro de Ligações" ) ).setBounds( 300, 10, 600, 80 );
        Font font_titulo = new Font( "Arial", Font.BOLD, 18 );
        titulo.setFont( font_titulo );

        //Mensagem
        img_sucesso = new ImageIcon( getClass().getResource( "/img/img_aplicar.png" ) );
        img_erro = new ImageIcon( getClass().getResource( "/img/img_cancelar.png" ) );

        lbl_msg = new JLabel();
        add( lbl_msg ).setBounds( 280, 360, 400, 30 );


        //CheckBox  clientes
        cbxClientes = new JComboBox();
        atualizaCbxClientes();
        cbxClientes.setToolTipText( "Selecione o cliente correspondente a ligação" );
        add( cbxClientes ).setBounds( 165, 160, 450, 40 );


        txt_qtde_ligacao = new JTextField();
        txt_qtde_ligacao.setDocument( new TextDocument( 2 ) );
        txt_qtde_ligacao.setText( "1" );
        add( new JLabel( "Ligações: " ) ).setBounds( 315, 270, 80, 30 );
        txt_qtde_ligacao.setToolTipText( "Informe a quantidade de ligações" );
        add( txt_qtde_ligacao ).setBounds( 395, 270, 60, 30 );


        checkTicket = new JCheckBox( "Cadastrar ticket para o atendimento" );
        add( checkTicket ).setBounds( 260, 320, 260, 30 );



        btnRealizadas = new JButton( "Ligação Realizada" );
        btnRealizadas.setIcon( new ImageIcon( getClass().getResource( "/img/img_lig_recebida.png" ) ) );
        btnRealizadas.setToolTipText( "Clique aqui para registrar a ligação realizada" );
        add( btnRealizadas ).setBounds( 395, 420, 220, 50 );


        btnRecebidas = new JButton( "Ligação Recebida" );
        btnRecebidas.setIcon( new ImageIcon( getClass().getResource( "/img/img_lig_realizada.png" ) ) );
        btnRecebidas.setToolTipText( "Clique aqui para registrar a ligação recebida" );
        add( btnRecebidas ).setBounds( 165, 420, 220, 50 );


        JLabel logo = new JLabel( new ImageIcon( getClass().getResource( "/img/img_suporte.png" ) ) );
        add( logo ).setBounds( 10, 20, 150, 150 );



    }

    public void atualizaCbxClientes()
    {
        int x = cbxClientes.getItemCount();

        if ( x > 0 )
        {
            cbxClientes.removeAllItems();
        }

        Banco conn = new Banco();
        ResultSet rs = conn.executarConsulta( "SELECT descricao FROM clientes WHERE ref_status = 1 order by descricao" );
        conn.fecha();

        try
        {

            cbxClientes.addItem( "Selecione o Cliente" );

            while ( rs.next() )
            {
                cbxClientes.addItem( rs.getString( "descricao" ) );
            }
        } catch ( Exception e )
        {
            JOptionPane.showMessageDialog( null, "Erro de banco de dados: " + e, "Erro", JOptionPane.ERROR_MESSAGE );
        }


    }

    public boolean validaCbxClientes( String a )
    {
        String cliente = "";
        boolean controle = false;


        Banco conn = new Banco();
        ResultSet rs = conn.executarConsulta( "SELECT descricao FROM clientes "
                + "WHERE descricao = '" + a + "' "
                + "AND ref_status != 1 " );
        conn.fecha();

        try
        {
            while ( rs.next() )
            {
                cliente = rs.getString( "descricao" );
            }

        } catch ( Exception e )
        {
            e.printStackTrace();
        }

        if ( !cliente.equalsIgnoreCase( "" ) )
        {
            cbxClientes.removeItem( cliente );
            JOptionPane.showMessageDialog( null, "Esse cliente acabou de ser desativado!" );
            controle = true;
        }

        return controle;

    }

    public void actions()
    {

        btnRealizadas.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent ae )
            {

                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();


                if ( checkTicket.isSelected() )
                {
                    JOptionPane.showMessageDialog( null, "Não é possível cadastrar ticket para ligações realizadas" );
                    return;
                }



                String cliente = cbxClientes.getSelectedItem().toString();
                int ref_user = FormPrincipal.getId_usuario();
                String ligacoes = txt_qtde_ligacao.getText();
                int lig_realizada = 0;
                int ref_cliente = 0;


                //Valida se o valor do campo quantidade é válido

                if ( ligacoes == null || ligacoes.equalsIgnoreCase( "" ) || ligacoes.equalsIgnoreCase( "0" ) )
                {

                    JOptionPane.showMessageDialog( null, "Informe a quantidade de ligações", "Mensagem", JOptionPane.WARNING_MESSAGE );
                    return;

                } else
                {
                    try
                    {
                        lig_realizada = Integer.parseInt( ligacoes );
                    } catch ( Exception e )
                    {
                        JOptionPane.showMessageDialog( null, "O valor informado não é válido!", "Mensagem", JOptionPane.WARNING_MESSAGE );
                        return;
                    }
                }

                //Valida se o cliente foi selecionado

                if ( validaCbxClientes( cliente ) == true )
                {
                    return;
                }


                if ( cliente.equalsIgnoreCase( null ) || cliente.equalsIgnoreCase( "Selecione o Cliente" ) )
                {
                    JOptionPane.showMessageDialog( null, "Selecione um cliente! ", "Mensagem", JOptionPane.WARNING_MESSAGE );
                    return;
                }




                try
                {

                    Banco conn = new Banco();
                    ResultSet rs = conn.executarConsulta( "SELECT id FROM clientes WHERE descricao = '" + cliente + "'" );

                    while ( rs.next() )
                    {
                        ref_cliente = rs.getInt( "id" );
                    }

                    conn.executarAtualizacao( "INSERT INTO ligacoes (id,ref_cliente,lig_realizada,ref_usuario,data,hora) "
                            + "VALUES (''," + ref_cliente + "," + lig_realizada + "," + ref_user + ",current_date(),current_time())" );
                    conn.fecha();

                    new ThreadAtualizaMensagem( lbl_msg, "Operação realizada com sucesso!", img_sucesso ).start();


                } catch ( Exception e )
                {
                    JOptionPane.showMessageDialog( null, "Erro de banco de dados : " + e, "Erro", JOptionPane.ERROR );

                    new ThreadAtualizaMensagem( lbl_msg, "Operação realizada com falhas!", img_erro ).start();
                }
            }
        } );


        btnRecebidas.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent ae )
            {

                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();


                String cliente = cbxClientes.getSelectedItem().toString();
                int ref_user = FormPrincipal.getId_usuario();
                String ligacoes = txt_qtde_ligacao.getText();
                int lig_recebida = 0;
                int ref_cliente = 0;


                //Valida se o valor do campo quantidade é válido
                if ( ligacoes == null || ligacoes.equalsIgnoreCase( "" ) || ligacoes.equalsIgnoreCase( "0" ) )
                {
                    JOptionPane.showMessageDialog( null, "Informe a quantidade de ligações", "Mensagem", JOptionPane.WARNING_MESSAGE );
                    return;
                }

                else
                {
                    try
                    {
                        lig_recebida = Integer.parseInt( ligacoes );
                    }

                    catch ( Exception e )
                    {
                        JOptionPane.showMessageDialog( null, "O valor informado não é válido!", "Mensagem", JOptionPane.WARNING_MESSAGE );
                        e.printStackTrace();
                        return;
                    }
                }


                //Valida se o cliente foi selecionado
                if ( validaCbxClientes( cliente ) == true )
                {
                    return;
                }



                if ( cliente.equalsIgnoreCase( null ) || cliente.equalsIgnoreCase( "Selecione o Cliente" ) )
                {
                    JOptionPane.showMessageDialog( null, "Selecione um cliente! ", "Mensagem", JOptionPane.WARNING_MESSAGE );
                    return;
                }



                try
                {
                    Banco conn = new Banco();
                    ResultSet rs = conn.executarConsulta( "SELECT id FROM clientes WHERE descricao = '" + cliente + "'" );

                    while ( rs.next() )
                    {
                        ref_cliente = rs.getInt( "id" );
                    }


                    if ( checkTicket.isSelected() )
                    {
                        createOccurrence( ref_cliente, lig_recebida, ref_user );
                    }

                    else
                    {
                        conn.executarAtualizacao( "INSERT INTO ligacoes (id,ref_cliente,lig_recebida,ref_usuario,data,hora) "
                                + "VALUES (''," + ref_cliente + "," + lig_recebida + "," + ref_user + ",current_date(),current_time())" );

                        conn.fecha();

                        new ThreadAtualizaMensagem( lbl_msg, "Operação realizada com sucesso!", img_sucesso ).start();
                    }

                }

                catch ( Exception e )
                {
                    JOptionPane.showMessageDialog( null, "Erro de banco de dados : " + e, "Erro", JOptionPane.ERROR_MESSAGE );

                    new ThreadAtualizaMensagem( lbl_msg, "Operação realizada com falhas!", img_erro ).start();
                }
            }
        } );


        cbxClientes.addMouseListener( new MouseListener()
        {

            public void mouseClicked( MouseEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
                atualizaCbxClientes();
            }

            public void mousePressed( MouseEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
                atualizaCbxClientes();
            }

            public void mouseReleased( MouseEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
            }

            public void mouseEntered( MouseEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
            }

            public void mouseExited( MouseEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
            }
        } );

        cbxClientes.addKeyListener( new KeyListener()
        {

            public void keyTyped( KeyEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
            }

            public void keyPressed( KeyEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
            }

            public void keyReleased( KeyEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
            }
        } );
    }

    private void createOccurrence( int ref_cliente, int lig_recebida, int ref_usuario )
    {
        try
        {
            Login l = com.interact.sas.cmn.ModuleContext.getInstance().getLoginManager().userLogin( FormPrincipal.getLogin_usuario() );

            if ( l != null )
            {
                ApplicationContext.getInstance().setActiveLogin( l );

                OccurrenceType ot = com.interact.sas.qms.ModuleContext
                                            .getInstance()
                                            .getOccurrenceTypeManager()
                                            .getOccurrenceType( properties.getTipoOcorrencia() );


                if ( OccurrenceFormFactory.getInstance().edit( this, ot.getMnemonic() ) )
                {
                    Occurrence o = ( ( Occurrence ) OccurrenceFormFactory.getInstance().getForm( ot.getMnemonic() ).getContext() );

                    getSerial();

                    try
                    {
                        Banco conn2 = new Banco();
                        conn2.executarAtualizacao( "INSERT INTO ligacoes (id,ref_cliente,lig_recebida,ticket,ref_ticket,ref_usuario,data,hora) "
                                + "VALUES (''," + ref_cliente + "," + lig_recebida + ",'" + ocorrencia.getSerial() + "'," + ocorrencia.getId() + "," + ref_usuario + ",current_date(),current_time())" );
                        conn2.fecha();

                        new ThreadAtualizaMensagem( lbl_msg, "Operação realizada com sucesso!", img_sucesso ).start();


                    }

                    catch ( Exception e )
                    {
                        JOptionPane.showMessageDialog( null, "Erro de banco de dados : " + e, "Erro", JOptionPane.ERROR );

                        new ThreadAtualizaMensagem( lbl_msg, "Operação realizada com falhas!", img_erro ).start();
                    }
                }
            }

            else
            {
                Prompts.alert( this, "Usuario inválido" );
            }

        }

        catch ( Exception e )
        {
            e.printStackTrace();
        }
    }

    private void getSerial()
    {
        try
        {
            QueryResult rs = Database.getInstance().executeQuery( "SELECT max(id), max(serial) FROM qms_occurrences WHERE ref_type = " + properties.getTipoOcorrencia() );

            if ( rs.next() )
            {
                this.ocorrencia.setId( rs.getInt( 1 ) );
                this.ocorrencia.setSerial( rs.getString( 2 ) );
            }
        }

        catch ( Exception e )
        {
            e.printStackTrace();
        }
    }
}
